Įsisavinkite JavaScript aiškiuosius konstruktorius tiksliam objektų kūrimui, patobulintam paveldėjimui ir geresniam kodo palaikymui. Mokykitės iš išsamių pavyzdžių ir geriausių praktikų.
JavaScript aiškus konstruktorius: patobulintas klasės apibrėžimas ir valdymas
JavaScript kalboje aiškus konstruktorius atlieka lemiamą vaidmenį apibrėžiant, kaip objektai yra kuriami iš klasės. Jis suteikia mechanizmą objekto savybių inicializavimui su konkrečiomis reikšmėmis, atliekant parengiamąsias užduotis ir kontroliuojant objekto kūrimo procesą. Suprasti ir efektyviai naudoti aiškiuosius konstruktorius yra būtina kuriant patikimas ir lengvai palaikomas JavaScript programas. Šis išsamus vadovas gilinsis į aiškiųjų konstruktorių subtilybes, nagrinėdamas jų privalumus, naudojimą ir geriausias praktikas.
Kas yra aiškus konstruktorius?
JavaScript kalboje, apibrėždami klasę, galite pasirinktinai apibrėžti specialų metodą pavadinimu constructor. Šis metodas yra aiškus konstruktorius. Jis automatiškai iškviečiamas, kai sukuriate naują klasės egzempliorių naudodami new raktinį žodį. Jei aiškiai neapibrėžiate konstruktoriaus, JavaScript fone pateikia numatytąjį, tuščią konstruktorių. Tačiau aiškaus konstruktoriaus apibrėžimas suteikia jums visišką objekto inicializavimo kontrolę.
Numanomasis ir aiškus konstruktoriai
Išsiaiškinkime skirtumą tarp numanomųjų ir aiškiųjų konstruktorių.
- Numanomasis konstruktorius: Jei savo klasėje neapibrėžiate
constructormetodo, JavaScript automatiškai sukuria numatytąjį konstruktorių. Šis numanomasis konstruktorius nieko nedaro; jis tiesiog sukuria tuščią objektą. - Aiškus konstruktorius: Kai savo klasėje apibrėžiate
constructormetodą, jūs kuriate aiškų konstruktorių. Šis konstruktorius vykdomas kiekvieną kartą, kai sukuriamas naujas klasės egzempliorius, leidžiantis jums inicializuoti objekto savybes ir atlikti bet kokius būtinus parengiamuosius veiksmus.
Aiškiųjų konstruktorių naudojimo privalumai
Aiškiųjų konstruktorių naudojimas suteikia keletą reikšmingų privalumų:
- Kontroliuojamas objekto inicializavimas: Jūs turite tikslią kontrolę, kaip inicializuojamos objekto savybės. Galite nustatyti numatytąsias reikšmes, atlikti patikrinimą ir užtikrinti, kad objektai būtų kuriami nuoseklioje ir nuspėjamoje būsenoje.
- Parametrų perdavimas: Konstruktoriai gali priimti parametrus, leidžiančius jums pritaikyti objekto pradinę būseną pagal įvesties reikšmes. Tai daro jūsų klases lankstesnes ir pakartotinai panaudojamas. Pavyzdžiui, klasė, atstovaujanti vartotojo profilį, galėtų priimti vartotojo vardą, el. paštą ir vietą objekto kūrimo metu.
- Duomenų patikrinimas: Konstruktoriuje galite įtraukti patikrinimo logiką, kad užtikrintumėte, jog įvesties reikšmės yra teisingos prieš priskiriant jas objekto savybėms. Tai padeda išvengti klaidų ir užtikrina duomenų vientisumą.
- Kodo pakartotinis panaudojamumas: Įtraukdami objekto inicializavimo logiką į konstruktorių, skatinate kodo pakartotinį panaudojamumą ir mažinate pertekliškumą.
- Paveldėjimas: Aiškūs konstruktoriai yra esminiai paveldėjimui JavaScript kalboje. Jie leidžia poklasiams tinkamai inicializuoti savybes, paveldėtas iš tėvinių klasių, naudojant
super()raktinį žodį.
Kaip apibrėžti ir naudoti aiškų konstruktorių
Štai žingsnis po žingsnio vadovas, kaip apibrėžti ir naudoti aiškų konstruktorių JavaScript kalboje:
- Apibrėžkite klasę: Pradėkite apibrėždami savo klasę naudodami
classraktinį žodį. - Apibrėžkite konstruktorių: Klasės viduje apibrėžkite metodą pavadinimu
constructor. Tai yra jūsų aiškus konstruktorius. - Priimkite parametrus (pasirinktinai):
constructormetodas gali priimti parametrus. Šie parametrai bus naudojami objekto savybėms inicializuoti. - Inicializuokite savybes: Konstruktoriaus viduje naudokite
thisraktinį žodį, kad pasiektumėte ir inicializuotumėte objekto savybes. - Kurkite egzempliorius: Kurkite naujus klasės egzempliorius naudodami
newraktinį žodį, perduodami konstruktoriui visus būtinus parametrus.
Pavyzdys: Paprasta „Person“ klasė
Pavaizduokime tai paprastu pavyzdžiu:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Sveiki, mano vardas ${this.name} ir man ${this.age} metų.`);
}
}
const person1 = new Person("Alice", 30);
const person2 = new Person("Bob", 25);
person1.greet(); // Išvestis: Sveiki, mano vardas Alice ir man 30 metų.
person2.greet(); // Išvestis: Sveiki, mano vardas Bob ir man 25 metų.
Šiame pavyzdyje Person klasė turi aiškų konstruktorių, kuris priima du parametrus: name ir age. Šie parametrai naudojami Person objekto name ir age savybėms inicializuoti. Tada greet metodas naudoja šias savybes, kad išspausdintų pasisveikinimą į konsolę.
Pavyzdys: Numatytųjų reikšmių tvarkymas
Taip pat galite nustatyti numatytąsias reikšmes konstruktoriaus parametrams:
class Product {
constructor(name, price = 0, quantity = 1) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
getTotalValue() {
return this.price * this.quantity;
}
}
const product1 = new Product("Laptop", 1200);
const product2 = new Product("Mouse");
console.log(product1.getTotalValue()); // Išvestis: 1200
console.log(product2.getTotalValue()); // Išvestis: 0
Šiame pavyzdyje, jei kuriant Product objektą price arba quantity parametrai nėra pateikiami, jiems bus priskirtos numatytosios reikšmės atitinkamai 0 ir 1. Tai gali būti naudinga nustatant protingas numatytąsias reikšmes ir mažinant rašomo kodo kiekį.
Pavyzdys: Įvesties patikrinimas
Galite pridėti įvesties patikrinimą į savo konstruktorių, kad užtikrintumėte duomenų vientisumą:
class BankAccount {
constructor(accountNumber, initialBalance) {
if (typeof accountNumber !== 'string' || accountNumber.length !== 10) {
throw new Error("Neteisingas sąskaitos numeris. Turi būti 10 simbolių eilutė.");
}
if (typeof initialBalance !== 'number' || initialBalance < 0) {
throw new Error("Neteisingas pradinis likutis. Turi būti neneigiamas skaičius.");
}
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
deposit(amount) {
if (typeof amount !== 'number' || amount <= 0) {
throw new Error("Neteisinga įnašo suma. Turi būti teigiamas skaičius.");
}
this.balance += amount;
}
}
try {
const account1 = new BankAccount("1234567890", 1000);
account1.deposit(500);
console.log(account1.balance); // Išvestis: 1500
const account2 = new BankAccount("invalid", -100);
} catch (error) {
console.error(error.message);
}
Šiame pavyzdyje BankAccount konstruktorius tikrina accountNumber ir initialBalance parametrus. Jei įvesties reikšmės yra neteisingos, metama klaida, neleidžianti sukurti neteisingo objekto.
Aiškūs konstruktoriai ir paveldėjimas
Aiškūs konstruktoriai atlieka gyvybiškai svarbų vaidmenį paveldėjime. Kai poklasis praplečia tėvinę klasę, jis gali apibrėžti savo konstruktorių, kad pridėtų arba modifikuotų inicializavimo logiką. super() raktinis žodis naudojamas poklasio konstruktoriuje, kad iškviestų tėvinės klasės konstruktorių ir inicializuotų paveldėtas savybes.
Pavyzdys: Paveldėjimas su super()
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log("Bendrinis gyvūno garsas");
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Iškviečia tėvinės klasės konstruktorių
this.breed = breed;
}
speak() {
console.log("Au!");
}
}
const animal1 = new Animal("Bendrinis gyvūnas");
const dog1 = new Dog("Buddy", "Auksinis retriveris");
animal1.speak(); // Išvestis: Bendrinis gyvūno garsas
dog1.speak(); // Išvestis: Au!
console.log(dog1.name); // Išvestis: Buddy
console.log(dog1.breed); // Išvestis: Auksinis retriveris
Šiame pavyzdyje Dog klasė praplečia Animal klasę. Dog konstruktorius iškviečia super(name), kad iškviestų Animal konstruktorių ir inicializuotų name savybę. Tada jis inicializuoja breed savybę, kuri yra specifinė Dog klasei.
Pavyzdys: Konstruktoriaus logikos perrašymas
Taip pat galite perrašyti konstruktoriaus logiką poklasyje, bet jūs privalote vis tiek iškviesti super(), jei norite teisingai paveldėti savybes iš tėvinės klasės. Pavyzdžiui, galbūt norėsite atlikti papildomus inicializavimo veiksmus poklasio konstruktoriuje:
class Employee {
constructor(name, salary) {
this.name = name;
this.salary = salary;
}
getSalary() {
return this.salary;
}
}
class Manager extends Employee {
constructor(name, salary, department) {
super(name, salary); // Iškviečia tėvinės klasės konstruktorių
this.department = department;
this.bonuses = []; // Inicializuoja vadovui specifinę savybę
}
addBonus(bonusAmount) {
this.bonuses.push(bonusAmount);
}
getTotalCompensation() {
let totalBonus = this.bonuses.reduce((sum, bonus) => sum + bonus, 0);
return this.salary + totalBonus;
}
}
const employee1 = new Employee("Jonas Jonaitis", 50000);
const manager1 = new Manager("Jana Smith", 80000, "Rinkodara");
manager1.addBonus(10000);
console.log(employee1.getSalary()); // Išvestis: 50000
console.log(manager1.getTotalCompensation()); // Išvestis: 90000
Šiame pavyzdyje Manager klasė praplečia Employee klasę. Manager konstruktorius iškviečia super(name, salary), kad inicializuotų paveldėtas name ir salary savybes. Tada jis inicializuoja department savybę ir tuščią masyvą premijoms saugoti, kurios yra specifinės Manager klasei. Tai užtikrina tinkamą paveldėjimą ir leidžia poklasiui praplėsti tėvinės klasės funkcionalumą.
Geriausios praktikos naudojant aiškiuosius konstruktorius
Kad užtikrintumėte, jog efektyviai naudojate aiškiuosius konstruktorius, laikykitės šių geriausių praktikų:
- Laikykite konstruktorius trumpus: Konstruktoriai turėtų pirmiausia sutelkti dėmesį į objekto savybių inicializavimą. Venkite sudėtingos logikos ar operacijų konstruktoriuje. Jei reikia, perkelkite sudėtingą logiką į atskirus metodus, kuriuos galima iškviesti iš konstruktoriaus.
- Tikrinkite įvestį: Visada tikrinkite konstruktoriaus parametrus, kad išvengtumėte klaidų ir užtikrintumėte duomenų vientisumą. Naudokite tinkamas tikrinimo technikas, tokias kaip tipų tikrinimas, diapazono tikrinimas ir reguliariosios išraiškos.
- Naudokite numatytuosius parametrus: Naudokite numatytuosius parametrus, kad pateiktumėte protingas numatytąsias reikšmes pasirenkamiems konstruktoriaus parametrams. Tai daro jūsų klases lankstesnes ir lengviau naudojamas.
- Teisingai naudokite
super(): Paveldėdami iš tėvinės klasės, visada iškvieskitesuper()poklasio konstruktoriuje, kad inicializuotumėte paveldėtas savybes. Įsitikinkite, kad perduodate teisingus argumentussuper(), atsižvelgiant į tėvinės klasės konstruktorių. - Venkite šalutinių poveikių: Konstruktoriai turėtų vengti šalutinių poveikių, tokių kaip globalių kintamųjų modifikavimas ar sąveika su išoriniais ištekliais. Tai daro jūsų kodą labiau nuspėjamą ir lengviau testuojamą.
- Dokumentuokite savo konstruktorius: Aiškiai dokumentuokite savo konstruktorius naudodami JSDoc ar kitus dokumentavimo įrankius. Paaiškinkite kiekvieno parametro paskirtį ir laukiamą konstruktoriaus elgseną.
Dažniausios klaidos, kurių reikia vengti
Štai keletas dažniausių klaidų, kurių reikia vengti naudojant aiškiuosius konstruktorius:
- Užmiršimas iškviesti
super(): Jei paveldite iš tėvinės klasės, užmiršus iškviestisuper()poklasio konstruktoriuje, įvyks klaida arba neteisingas objekto inicializavimas. - Neteisingų argumentų perdavimas
super(): Įsitikinkite, kad perduodate teisingus argumentussuper(), atsižvelgiant į tėvinės klasės konstruktorių. Perduodant neteisingus argumentus, gali atsirasti netikėta elgsena. - Perteklinės logikos vykdymas konstruktoriuje: Venkite vykdyti perteklinę logiką ar sudėtingas operacijas konstruktoriuje. Tai gali apsunkinti kodo skaitymą ir palaikymą.
- Įvesties patikrinimo ignoravimas: Neįvertinus konstruktoriaus parametrų, gali kilti klaidų ir duomenų vientisumo problemų. Visada tikrinkite įvestį, kad užtikrintumėte, jog objektai yra sukurti teisingoje būsenoje.
- Konstruktorių nedokumentavimas: Neuždokumentavus savo konstruktorių, kitiems kūrėjams gali būti sunku suprasti, kaip teisingai naudoti jūsų klases. Visada aiškiai dokumentuokite savo konstruktorius.
Aiškiųjų konstruktorių pavyzdžiai realaus pasaulio scenarijuose
Aiškūs konstruktoriai plačiai naudojami įvairiuose realaus pasaulio scenarijuose. Štai keletas pavyzdžių:
- Duomenų modeliai: Klasės, atstovaujančios duomenų modelius (pvz., vartotojų profilius, produktų katalogus, užsakymų detales), dažnai naudoja aiškiuosius konstruktorius, kad inicializuotų objekto savybes su duomenimis, gautais iš duomenų bazės ar API.
- Vartotojo sąsajos komponentai: Klasės, atstovaujančios vartotojo sąsajos komponentus (pvz., mygtukus, teksto laukus, lenteles), naudoja aiškiuosius konstruktorius, kad inicializuotų komponento savybes ir konfigūruotų jo elgseną.
- Žaidimų kūrimas: Žaidimų kūrime klasės, atstovaujančios žaidimo objektus (pvz., žaidėjus, priešus, sviedinius), naudoja aiškiuosius konstruktorius, kad inicializuotų objekto savybes, tokias kaip padėtis, greitis ir gyvybės.
- Bibliotekos ir karkasai: Dauguma JavaScript bibliotekų ir karkasų labai remiasi aiškiaisiais konstruktoriais objektams kurti ir konfigūruoti. Pavyzdžiui, diagramų biblioteka gali naudoti konstruktorių, kad priimtų duomenis ir konfigūracijos parinktis diagramai sukurti.
Išvada
JavaScript aiškūs konstruktoriai yra galingas įrankis, skirtas kontroliuoti objektų kūrimą, pagerinti paveldėjimą ir pagerinti kodo palaikomumą. Suprasdami ir efektyviai naudodami aiškiuosius konstruktorius, galite kurti patikimas ir lanksčias JavaScript programas. Šis vadovas pateikė išsamią aiškiųjų konstruktorių apžvalgą, apimančią jų privalumus, naudojimą, geriausias praktikas ir dažniausiai pasitaikančias klaidas, kurių reikia vengti. Laikydamiesi šiame straipsnyje aprašytų gairių, galite pasinaudoti aiškiaisiais konstruktoriais, kad rašytumėte švaresnį, lengviau palaikomą ir efektyvesnį JavaScript kodą. Pasinaudokite aiškiųjų konstruktorių galia, kad pakeltumėte savo JavaScript įgūdžius į kitą lygį.